/*
 * Kinect.h
 *
 */

#ifndef KINECT_H_
#define KINECT_H_

#include <opencv/cv.h>
#include <opencv/highgui.h>

namespace kinect {

/**
 * \class Kinect
 * @brief Classe che definisce le interfacce dei metodi per la connessione con un device Microsoft Kinect e la sua gestione. Essendo i metodi di questa classe dichiarati come virtuali puri, una loro implementazione concreta �� demandata alle classi che estendono Kinect.
 * @details Microsoft Kinect e' dotato di telecamera RGB, doppio sensore di profondit�� a raggi infrarossi composto da un proiettore a infrarossi e da una telecamera sensibile alla stessa banda. La telecamera RGB ha una risoluzione di 640 �� 480 pixel, mentre quella a infrarossi usa una matrice di 320 �� 240 pixel. Kinect dispone anche di un array di microfoni utilizzato dal sistema per la calibrazione dell'ambiente in cui ci si trova, mediante l'analisi della riflessione del suono sulle pareti e sull'arredamento.
 * @date May 25, 2012
 * @author Gennaro Capo
 * @author Mirko Conte
 * @author Vincenzo De Notaris
 * @author Roberto Pacilio
 * @version 1.0
 * @namespace kinect
 */
class Kinect {

public:

	/**
	 * Costruttore della classe Kinect.
	 */
	Kinect();

	/**
	 * Distruttore della classe Kinect.
	 */
	virtual ~Kinect();

	/**
	 * Metodo per la distruzione dell'unica istanza possibile (singleton) della classe Kinect.
	 */
	virtual void release() = 0;

	/**
	 * Metodo che restituisce l'indice associato al device Microsoft Kinect utilizzato.
	 * @return indice associato al device Microsoft Kinect utilizzato.
	 */
	virtual unsigned short int getId() const = 0;

	/**
	 * Metodo per lo starting della cattura dei frame da parte della camera standard.
	 */
	virtual void startBGRCapture() = 0;

	/**
	 * Metodo per fermare la cattura dei frame da parte della camera standard.
	 */
	virtual void stopBGRCapture() = 0;

	/**
	 * Metodo per lo starting della cattura dei frame da parte della camera IR.
	 */
	virtual void startDepthCapture() = 0;

	/**
	 * Metodo per fermare la cattura dei frame da parte della camera IR.
	 */
	virtual void stopDepthCapture() = 0;

	/**
	 * Metodo per controllare se la cattura delle immagini BGR �� iniziata o meno.
	 * @return true se la cattura delle immagini BGR �� iniziata, false altrimenti.
	 */
	virtual bool isBGRStarted() const = 0;

	/**
	 * Metodo per controllare se la cattura delle immagini di prodonfita' �� iniziata o meno.
	 * @return true se la cattura delle immagini di profondita' �� iniziata, false altrimenti.
	 */
	virtual bool isDepthStarted() const = 0;

	/**
	 *
	 * @param dest
	 */
	virtual void getBGRFrame(cv::Mat& dest) = 0;

	/**
	 *
	 * @param dest
	 */
	virtual void getDepthFrame(cv::Mat& dest) = 0;

	virtual void alza() = 0;

	virtual void abbassa() = 0;

	virtual void azzera() = 0;

private:

	/*
	 * Previene dalla costruzione mediante copia.
	 */
	Kinect(const Kinect&);

	/*
	 * Previene l'assegnamento.
	 */
	Kinect& operator = (const Kinect&);

};

} /* namespace kinect */

#endif /* KINECT_H_ */
